package com.sz.virtualbank.service.loan;

import com.sz.virtualbank.dao.entity.LoanRecord;
import com.sz.virtualbank.dao.entity.LoanRepaymentPlan;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 贷款服务接口
 * 
 * @author Claude
 */
public interface LoanService {
    
    /**
     * 贷款申请
     *
     * @param userId 用户ID
     * @param amount 贷款金额
     * @param loanTerm 贷款期限(月)
     * @param purpose 贷款用途
     * @param repaymentMethod 还款方式(1:等额本息,2:等额本金,3:一次性还本付息)
     * @return 贷款申请信息
     */
    LoanRecord applyLoan(Long userId, BigDecimal amount, Integer loanTerm, String purpose, Integer repaymentMethod);
    
    /**
     * 查询贷款列表
     *
     * @param userId 用户ID
     * @param status 贷款状态（可选）
     * @param page 页码
     * @param size 每页条数
     * @return 贷款列表与总数
     */
    Map<String, Object> getLoanList(Long userId, Integer status, Integer page, Integer size);
    
    /**
     * 查询贷款详情
     *
     * @param id 贷款ID
     * @param userId 用户ID
     * @return 贷款详情
     */
    Map<String, Object> getLoanDetail(Long id, Long userId);
    
    /**
     * 查询贷款还款计划
     *
     * @param loanId 贷款ID
     * @param userId 用户ID
     * @return 还款计划列表
     */
    List<LoanRepaymentPlan> getRepaymentPlan(Long loanId, Long userId);
    
    /**
     * 贷款还款
     *
     * @param userId 用户ID
     * @param loanId 贷款ID
     * @param repaymentPlanId 还款计划ID
     * @param amount 还款金额
     * @param paymentPassword 支付密码
     * @return 交易流水号
     */
    String repayLoan(Long userId, Long loanId, Long repaymentPlanId, BigDecimal amount, String paymentPassword);
    
    /**
     * 提前还款试算
     *
     * @param loanId 贷款ID
     * @param userId 用户ID
     * @param repayDate 还款日期
     * @return 提前还款信息
     */
    Map<String, Object> calculateEarlyRepayment(Long loanId, Long userId, String repayDate);
    
    /**
     * 提前还款
     *
     * @param userId 用户ID
     * @param loanId 贷款ID
     * @param amount 还款金额
     * @param paymentPassword 支付密码
     * @return 交易流水号
     */
    String earlyRepayment(Long userId, Long loanId, BigDecimal amount, String paymentPassword);
    
    /**
     * 贷款审批
     *
     * @param loanId 贷款ID
     * @param approved 是否批准
     * @param remark 备注
     * @return 是否成功
     */
    boolean approveLoan(Long loanId, boolean approved, String remark);
    
    /**
     * 生成还款计划
     *
     * @param loanId 贷款ID
     * @return 是否成功
     */
    boolean generateRepaymentPlan(Long loanId);
}
